package dev.ece.suit.loader;

import dev.ece.util.lib.Matrix4f;

/**
 * 关节信息
 * @author 潜行的虚影
 *
 */
public interface Joint<T extends Number & Comparable<T>> {
	
	/**
	 * 更新骨骼矩阵(FinalMatrix)
	 * @param current
	 */
	default void update(T current) {
		if(this.hasKeyFrames()) {
			//更新骨骼矩阵
			this.updateGlobalTransform(current);
			//最终矩阵
			this.getFinalTransform().mul(
					this.getGlobalTransform(), 
					this.getOffsetTransform());
			//法线矩阵
			this.getNormalTransform().set(this.getFinalTransform());
			this.getNormalTransform().invert().transpose();
		}
	}
	
	/**
	 * 更新骨骼矩阵
	 * @param current
	 */
	default void updateGlobalTransform(T current) {
		Matrix4f local = this.getLocalTransform(current);
		if(this.hasParent()) {
			this.getGlobalTransform().mul(this.getParent().getGlobalTransform(), local);
		} else {
			this.getGlobalTransform().set(local);
		}
	}
	
	/**
	 * 是否有关键帧信息
	 * @return
	 */
	public boolean hasKeyFrames();
	
	/**
	 * 父关节
	 * @return
	 */
	public Joint<T> getParent();
	
	/**
	 * 是否有父关节
	 * @return
	 */
	default boolean hasParent() {
		return getParent() != null;
	}
	
	/**
	 * 关节名称
	 * @return
	 */
	public String getName();
	
	/**
	 * 获取实时local矩阵
	 * @param current
	 * @return
	 */
	public Matrix4f getLocalTransform(T current);
	
	/**
	 * Combine矩阵
	 * @return
	 */
	public Matrix4f getGlobalTransform();
	
	/**
	 * offset矩阵
	 * @return
	 */
	public Matrix4f getOffsetTransform();
	
	/**
	 * 最终蒙皮矩阵
	 * @return
	 */
	public Matrix4f getFinalTransform();
	
	/**
	 * 法线矩阵
	 * @return
	 */
	public Matrix4f getNormalTransform();
	
}
